'use strict';
const rules={
    title:{
        type:'string',
        require:true,
        desc:'视频标题'
    },
    cover:{
        type:'string',
        require:true,
        desc:'封面'
    },
    category_id:{
        type:'string',
        require:true,
        desc:'分类ID'
    },
    desc:{
        type:'string',
        require:true,
        desc:'描述'
    }
}
const Controller = require('egg').Controller;

class VideoController extends Controller {
  async save() {
    let {ctx,app}=this
    let current_user_id=ctx.authUser.id
    // 参数验证
    ctx.validate(rules)
    // 获取参数
    let {title,category_id,cover,desc}=ctx.request.body
    // 添加数据
    let res=await app.model.Video.create({
        title,category_id,cover,desc,
        user_id:current_user_id
    })
    // 返回添加的数据
    ctx.apiSuccess(res)

  }
  // 指定用户的视频列表
  async index() {
    let { ctx, app } = this;
    let currentUser = ctx.authUser;
    ctx.validate({
        page: {
            required: true,
            desc: "页码",
            type: "int"
        },
        user_id: {
            required: true,
            desc: "用户id",
            type: "int"
        }
    });
    // http://127.0.0.1:7001/1?user_id=
    let user_id = ctx.query.user_id;
    let rows = await ctx.page(app.model.Video, {
        user_id
    });
    ctx.apiSuccess(rows);
  }
  // 指定用户的视频列表
  async search() {
    let { ctx, app } = this;
    let currentUser = ctx.authUser;
    ctx.validate({
        page: {
            required: true,
            desc: "页码",
            type: "int"
        },
        keyword: {
            required: true,
            desc: "关键字",
            type: "string"
        },
        limit:{
            required: false,
            desc: "页码",
            type: "int"
        }
    });
    // http://127.0.0.1:7001/1?user_id=
    let keyword = ctx.query.keyword;
    let Op=app.Sequelize.Op
    let rows = await ctx.page(app.model.Video, {
       title:{
           [Op.like]:'%'+keyword+'%'
       }
    });
    ctx.apiSuccess(rows);
  }

  // 更新作品
  async update(){
    // 结构数据
    let {app,ctx}=this
    // 获取当前的id
    let currentUser = ctx.authUser;
   
    // 参数验证
    ctx.validate({
        id:{
            type:'int',
             required:true,
             desc:'视频ID'
        },
        ...rules
    })
    // 获取参数
    let {title,category_id,cover,desc}=ctx.request.body
    // 判断视频是否存在
    let video=await app.model.Video.findOne({
        where:{
            id:ctx.params.id,
            user_id:currentUser.id
        }
    })
    if(!video){
        return ctx.throw(404,'记录不存在')
    }
    // 更新视频信息
    let res=await video.update({
        title,category_id,cover,desc
    })
    // 返回
    ctx.apiSuccess(res)
  }  
  //删除作品
  async destroy(){
    // 解构
    let {ctx,app}=this
    let user_id=ctx.authUser.id
  
    // 参数验证
    ctx.validate({
        id:{
        type:'int',
        desc:'作品ID',
        required:true    
        }
    })
    // 获取参数
    let {id}=ctx.request.body
    // 判断作品是否存在
    let video=await app.model.Video.findOne({
        where:{
            id
        }
    })
    if(!video){
        return ctx.throw(400,'作品记录不存在')
    }
    // 删除作品
    await video.destroy()
    // 返回结果
    ctx.apiSuccess('ok')
  }   

  //指定分类下的作品分页
  async list(){
    // 解构
    let {ctx,app}=this
    // 参数验证
    ctx.validate({
        category_id:{
            type:'int',
            required:true,
            desc:'分类ID'
        },
        page:{
            type:'int',
            required:true,
            desc:'分页'
        }
    })
    // 获取参数
    let {category_id}=ctx.params
    // 分页查询
    let rows=await ctx.page(app.model.Video,{category_id})
    // 返回
    ctx.apiSuccess(rows)
  }

  // 获取视频详情
  async read(){
    // 解构
    let {ctx,app,service}=this
    // 获取当前用户id
    let currentUser=ctx.authUser
    // 参数验证
    ctx.validate({
        id:{
            type:'int',
            required:true,
            desc:'作品'
        }
    })
    // 获取参数
    let {id}=ctx.params
    // 获取热门
    let hot=await this.hot()
    // 获取作品+关联视频详情
    let video=await app.model.Video.findOne({
        where:{
            id
        },
        include:[
            {
                model:app.model.VideoDetail
            },
            {
                model:app.model.User,
                attributes: ['id', 'username', 'nickname', 'avatar']
            }
        ]
    })
    // 判断是否关注
    let fava=false
    let follow=false
    // 判断视频收藏
    if(currentUser){
        fava=!!await app.model.Fava.findOne({
            where:{
                video_id:video.id,
                user_id:currentUser.id
            }
        })
        follow=await service.user.isFollow(currentUser.id,video.user_id)
    }
    // 返回数据 hot follow fava video
    ctx.apiSuccess({
        hot,
        video,
        fava,
        follow
    })
  }
    //获取热门视频
  async hot(){
        let {ctx,app}=this
        let res=await app.model.Video.findAll({
            order: [
                ['id', 'DESC'],
                ['play_count', 'DESC']
            ],
            limit: 5
        })
        return res
  }
  async indexlist(){
    let {ctx,app}=this
    let res=await app.model.Video.findAll({
        order: [
            ['id', 'DESC'],
            ['play_count', 'DESC']
        ],
        limit: 6
    })
      ctx.apiSuccess(res)
  }

}

module.exports = VideoController;
